home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_11_11
/
1110072c
< prev
next >
Wrap
Text File
|
1993-01-17
|
4KB
|
125 lines
/********************* DATACOMP.C *********************/
#include <alloc.h>
#include <conio.h>
#include "randefs.h"
#include "datacomp.h"
#include "displays.h"
int MakeHistogram(RAND *dat)
{ int i, nbin = dat->nbin;
index *hstogm;
float *frqdst;
NewScreen(*(dat->labls+nbin) );
DrawAxes(dat);
frqdst = (float *)calloc(nbin, sizeof(float) );
hstogm = (index *)calloc(nbin, sizeof(index) );
while ( (dat->ndat >= 0) && (kbhit() == 0) )
{ dat->ev_indx = SumNPicks(dat);
UpdateDistrib(dat, hstogm, frqdst);
DisplayFreq(dat, frqdst);
}
if (ESC == getch()) /* User's chance to exit */
{ free( (void *)frqdst );
free( (void *)hstogm );
return(1);
}
DisplayStats(dat, frqdst);
free( (void *)frqdst );
free( (void *)hstogm );
if (ESC == getch()) /* User's chance to exit */
return(1);
return(0);
}
void UpdateDistrib(RAND *dat, index *hstogm, float *frqdst)
{ int i, nd = ++dat->ndat, nbin = dat->nbin;
int indx = dat->ev_indx;
float k0 = 1/(nd*dat->delta);
for (i = 0; i < nbin; i++)
if (indx == i)
{ ++(*(hstogm+i)); /* Add 1 to bin */
break;
}
for (i = 0; i < nbin; i++)
*(frqdst+i) = k0*(float)(*(hstogm+i));
}
void AddNoise(int *in, int *out, RAND *noise)
{ int i, nbin = noise->nbin;
int *input = in, *noisydat = out;
float sf;
/******* Amplitude scaling factors ********/
if (nbin < 6) /* 1 and 2 coins */
sf = 5;
else if (nbin < 11) /* Single die */
sf = 2;
else if (nbin == 24) /* Uniform Circular */
sf = 0.5;
else /* Dice and normal */
sf = 0.8;
*noisydat++ = *input++; /* Copy the data size */
for (i = 0; i < SPAN; i++)
*noisydat++ = *input++ + sf*(2*SumNPicks(noise)-(nbin-1));
}
void MakeScopeSignals(RAND *dat, int wt_tbl[][MAXWTLEN])
{ int i, nbin = dat->nbin, *signalbuf, *auxbuf, *wts;
/******** Simulated Oscilloscope Signals ********/
NewScreen( *(dat->labls+nbin) );
ScreenLabels();
signalbuf = (int *)calloc(SPAN, sizeof(int) );
auxbuf = (int *)calloc(SPAN, sizeof(int) );
/******** Generate Simulated Square Wave ********/
MakeSqWave(signalbuf, 5);
DrawData(signalbuf, 0.98*FS); /* Display it */
/************* Add Noise to Signal **************/
AddNoise(signalbuf, auxbuf, dat);
DrawData(auxbuf, 0.76*FS); /* Display it */
/************ Filter the Noisy Signal ***********/
for (i = 0; i < 3; i++)
{ Filter(auxbuf, signalbuf, wt_tbl[i] );
DrawData(signalbuf, (0.54-i*0.22)*FS );
}
free((void *)auxbuf);
free((void *)signalbuf);
}
void MakeSqWave(int *data, int n_halfcycls)
{ int i, k, *dat = data;
*dat++ = SPAN; /* 1st entry = data size */
for (k = 0; k < n_halfcycls; k++)
for (i = 0; i < SPAN/n_halfcycls; i++)
*dat++ = !(k%2) ? 0 : -50;
while ( (dat-data-1) < SPAN )
*dat++ = 0; /* Clean-up */
}
void Filter(int *rawdat, int *filtrdat, int *wt_tbl)
{ int *wt = wt_tbl, *raw = rawdat, *new = filtrdat;
int i, i0, k, nwts, ndat, norm;
nwts = *wt++; /* size of wt vector = odd no. */
norm = *wt++; /* Normalization factor */
ndat = *raw++; /* size of data */
i0 = nwts/2;
*new++ = ndat-2*i0; /* Size of filtered data */
for (i = i0; i < ndat-i0; i++)
{ *new = 0;
for (k = 0; k < nwts; k++)
*new += *(raw+k)*(*(wt+k)); /* Get wt'd sum */
*new++ /= norm; /* Normalize it */
raw++;
}
}